import { jwtDecode } from 'jwt-decode'
import { useUserStore } from '@/store/user'

/**
 * 获取令牌信息
 * @returns 
 */
export function getTokenInfo() {
    // 从存储中获取令牌
    const token = getToken()
    // 解码令牌
    const decodedToken = jwtDecode(token)
    // 解析并返回用户信息
    return JSON.parse(decodedToken.userInfo) 
  }

  /**
   * 获取当前用户的令牌
   * @returns 
   */
  export function getToken() {
    // 获取pinia用户存储实例
    const userStore = useUserStore()
    // 从pinia用户存储中获取令牌
    const token = userStore.token
    // 返回令牌
    return token
  }

  /**
   * 解析JWT（JSON Web Token）
   * @param token 
   * @returns 
   */
  export function parseJwt(token:string) {
    // 分割JWT的三个部分
    var parts = token.split('.')
    // 解码JWT的payload部分
    var payload = decodeBase64Url(parts[1])
    // 将解码后的payload转换为对象
    return JSON.parse(payload)
  }

  /**
   * 解码Base64 URL字符串
   * Base64 URL是Base64编码的变体，使用 '-' 代替 '+'，'_' 代替 '/'，并且通常省略尾部的 '='
   * 此函数的目的是将这样的Base64 URL字符串转换回其原始形式
   * 
   * @param input 需要解码的Base64 URL字符串
   * @returns 解码后的原始字符串
   * @throws 如果输入字符串不是有效的Base64字符串，则抛出错误
   */
  function decodeBase64Url(input: string) {
    // 将Base64 URL字符 '-' 和 '_' 替换回Base64编码标准的 '+' 和 '/'
    var base64 = input.replace(/-/g, '+').replace(/_/g, '/')
  
    // 根据Base64编码后的字符串长度模4的结果，决定是否需要以及如何填充尾部的 '='
    switch (base64.length % 4) {
      case 0:
        // 长度模4余0，无需填充
        break
      case 2:
        // 长度模4余2，需要填充两个 '='
        base64 += '=='
        break
      case 3:
        // 长度模4余3，需要填充一个 '='
        base64 += '='
        break
      default:
        // 如果长度模4的结果既不是0、2、3中的任意一个，说明输入不是有效的Base64字符串，抛出错误
        throw 'Invalid base64 string'
    }
  
    // 使用atob()将Base64编码的字符串转换回二进制数据，然后使用decodeURIComponent()将其解码为原始字符串
    return decodeURIComponent(atob(base64))
  }